// !函数类型
// #为函数定义类型
function add1(x: number, y: number): number {
  return x + y;
}

const add2 = (x: number, y: number): number => {
  return x + y
}

// #完整的函数类型
let add3: (x: number, y: number) => number;
add3 = (x: number, y: number): number => x + y;
// add3 = (arg1: string, arg2: string): string => arg1 + arg2; // error 不能将类型“number”分配给类型“string”。

// #使用接口定义函数类型
interface Add {
  (x: number, y: number): number
}
let add4: Add = (x: number, y: number): number => x + y
console.log(add4(1, 2)); //3

// #使用类型别名
type Add2 = (x: number, y: number) => number
let add5: Add = (x: number, y: number): number => x + y

// !参数
// #可选参数
type Add3 = (x: number, y: number) => number;
let add6: Add = (arg1: number, arg2: number): number => arg1 + arg2;
// let add6: Add = (arg1: string, arg2: string): string => arg1 + arg2;

add6(1, 2); // 3
// add6(1, 2, 3); // error 应有 2 个参数，但获得 3 个
// add6(1); // error 应有 2 个参数，但获得 1 个

// type Add4 = (x?: number, y: number) => number; // error 必选参数不能位于可选参数后。

// #默认参数
const add67 = (x: number, y = 2) => {
  return x + y;
};
// add(1, "a"); // error 类型"string"的参数不能赋给类型"number"的参数

const add7 = (x: number, y: number = 2) => {
  return x + y;
};

// #剩余参数
const handleData = (arg1: number, ...args: number[]) => {
  //
};
// handleData(1, "a"); // error 类型"string"的参数不能赋给类型"number"的参数

// !函数重载
// TypeScript的函数重载通过为一个函数指定多个函数类型定义，从而对函数调用的返回值进行检查
// function handleData1(x: string): string[]; // 这个是重载的一部分，指定当参数类型为string时，返回值为string类型的元素构成的数组
// function handleData2(x: number): string; // 这个也是重载的一部分，指定当参数类型为number时，返回值类型为string
// function handleData3(x: any): any { // 这个就是重载的内容了，他是实体函数，不算做重载的部分
//   if (typeof x === "string") {
//     return x.split("");
//   } else {
//     return x
//       .toString()
//       .split("")
//       .join("");
//   }
// }
// handleData3("abc").join("");
// handleData2(123).join("_"); // error 类型"string"上不存在属性"join"
// handleData1(false); // error 类型"boolean"的参数不能赋给类型"number"的参数。

